VisualHMI - 分期应用
什么是分期?
当设备处于试用阶段,终端分期试用时,VisualHMI 则在设定的时间上,自动锁屏,用户无法正常控制设备运行。需要供应商告诉用户密码,输入正确后,用户则可照常使用。
使用范围:VisualHMI - HMI&M系列
1. 分期使用
当前系统时间到截止分期时间,HMI会弹出分期密码输入的画面,用户输入该期的分期密码后,才可以继续正常使用。否者,一直锁定在分期密码输入画面。
如当前系统时间2023-10-01 00:00:00,第一期时间为2023-11-01,则需要输入第一期的密码,第一期输入密码的时间段为当前时间~2023-01-01。
1.1 属性说明
点击菜单栏中【工程】→【工程设置】分期使用,属性说明如下所示:
启用分期:使能后才支持分期功能
分期数:最大支持10个分期
到期锁定画面ID:填入对应的画面ID
到期日:假设当前HMI的时间小于 分期1(2023/1/1)。则到分期1时间截止前,需要输入密码才可以使用
- 密码:各个分期时间的密码
1.2 系统寄存器
分期相关系统寄存器,其中SysStageTimeLevel 为索引,数值范围0~9, 如下所示:
2.应用
2.1.分期配置
点击菜单栏中【工程】→【工程设置】分期使用,配置如下所示:
启动分期:√
分期数:5
到期锁定画面ID:1
第1期到期日和密码:2023/11/1,1111
- 第2期到期日和密码:2023/12/1,2222
- 第3期到期日和密码:2024/1/1,3333
- 第4期到期日和密码:2024/2/1,4444
- 第5期到期日和密码:2024/3/1,5555
2.2.锁定配置
2.2.1.画面配置
“分期锁定”界面,添加一个数值控件,用来密码输入,属性如下所示:
启用输入:√
键盘类型:弹出键盘
键盘画面:100_digit320*240
读取地址:$SysStageEnterPwd(LW0205)
数据类型:UINT32
“分期锁定”界面,添加一个数值控件,用来表示输入第几期密码,属性如下所示:
读取地址:$SysStageTimeLevel(LW0204)
数据类型:UINT16
特殊转换:√
缩放:1
偏移:1
2.2.2.运行预览
编辑下载到屏幕,假设当前屏幕时间为2023/12/5号,需要输入第3期2024/1/1号的密码,如下所示:
2.3.分期时间
2.3.1.工程配置
分期时间,添加5个RTC控件,属性配置如下所示:
日期:YYYY/MM/DD;
星期:不显示;
时间:不显示;
设置时间:点击进入;
模式:日期;
使用时间戳:√;
读写地址:LW0210/LW0212/LW0214/LW0216/LW0218
2.3.2.LUA脚本
修改时间掉电存储,需要LUA脚本设置系统配置寄存器SysCfgCtrl(0x011A)、SysCfgOption(0x011B),如下所示:
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1000
then
......
elseif addr >= 0x0210 and addr <= 0x0218 --分期时间地址,此处共5个分期,地址LW0210/LW0212/LW0214/LW0216/LW0218
then
set_uint16(VT_LW, 0x011B, (1<<5))-- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5501)-- 保存
end
end
end
2.3.3.下载运行
实体屏上测试,虚拟屏不支持
2.4.分期密码
分期密码不支持读取,修改需要通过LUA脚本,set_stage_pwd(level,pwd)
set_stage_pwd(level,pwd):修改分期密码
- level: 用户等级0~9,对应分期1~分期10
- pwd: 用户数字密码
用户修改密码或初始化时候,可以将密码写到RW寄存器,修改后时查看当前密码
2.4.1.工程配置
画面上添加5个数值控件,用于修改分期密码的接口,配置如下所示:
启用输入:√
读取地址:RW0000/RW0002/RW0004/RW0006/RW0008
数据类型:UINT32
2.4.2.LUA脚本
屏幕首次使用,可以分期配置的密码写入Flash中。新的Flash里的内容都是0xFF,LUA脚本可以读取一个地址(0x000A~0x7FFF,历程中已用了0x0000~0x0008),用来判读初始化寄存器的标识。
初始化分期密码:
function on_init()
local _val = get_uint16(VT_RW, 0x2000)
if _val ~= 0x0055
then
--和分期设置的初始密码一致
set_uint32(VT_RW, 0x0000, 1111)
set_uint32(VT_RW, 0x0002, 2222)
set_uint32(VT_RW, 0x0004, 3333)
set_uint32(VT_RW, 0x0006, 4444)
set_uint32(VT_RW, 0x0007, 5555)
set_uint16(VT_RW, 0x2000, 0x0055)
end
set_uint16(VT_LW, 0x011B, (1<<5)) -- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5502) -- 加载,从set_stage_pwd后的密码加载
end
修改分期密码,在on_updata(...)回调函数里面,判断RW寄存器触发,将寄存器的值设置对应的分期密码,并存储。
function on_update(slave,vtype,addr)
......
if vtype == VT_RW
then
if addr >= 0x0000 and addr <= 0x0008
then
local psw = get_uint32(vtype, addr)
local idx = (addr // 0x0002) + 1
set_stage_pwd(idx, psw) -- 设置对应等级密码
set_uint16(VT_LW, 0x011B, (1<<5))-- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5501)-- 保存
end
end
end
2.4.3.下载运行
实体屏上测试,虚拟屏不支持
2.5.恢复分期
修改了分期时间或密码,还可以恢复到工程分期配置的初始数据
2.5.1.工程配置
画面添加一个字设置按钮,用于触发恢复分期设置,配置如下所示:
写入地址:LW1000
写入常量:0
- 常量值:0
2.5.2.LUA脚本
在on_updata函数里面,检测到LW1000地址写入1,设置SysCfgCtrl(0x011A)、SysCfgOption(0x011B)寄存器清除分期数据,并设置RW寄存器,如下所示
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1000
then
local key = get_uint16(VT_LW, addr)
if key == 1
then
set_uint16(VT_LW, 0x011B, (1<<5))-- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5503)-- 恢复
--设置RW寄存器原分期密码
set_uint32(VT_RW, 0x0000, 1111)
set_uint32(VT_RW, 0x0002, 2222)
set_uint32(VT_RW, 0x0004, 3333)
set_uint32(VT_RW, 0x0006, 4444)
set_uint32(VT_RW, 0x0007, 5555)
end
end
end
end
2.5.3.下载运行
实体屏上测试,虚拟屏不支持
2.6.分期开关
分期可以动态设置开启、关闭。如用户结清余款,可以一键关闭分期功能
2.6.1.工程配置
画面中添加一个位状态指示灯,用于分期的开启、关闭。控件配置如下所示:
2.6.2.LUA脚本
在on_updata(...)回调函数里面,判断LW1000寄存器触发,设置分期组数并存储。
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1000
then
......
elseif addr == 0x1001
then
local key = get_uint16(VT_LW, addr)
if key == 0
then
set_uint16(VT_LW, 0x0200, 0) -- 设置分期数0
set_uint16(VT_LW, 0x011B, (1<<5))-- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5501)-- 保存
elseif key == 1
then
set_uint16(VT_LW, 0x0200, 1) -- 设置分期数1
set_uint16(VT_LW, 0x011B, (1<<5))-- 选择分期密码
set_uint16(VT_LW, 0x011A, 0x5501)-- 保存
end
end
end
end
2.5.3.下载运行
实体屏上测试,虚拟屏不支持